package main

import (
	"errors"
	"fmt"
)

type CodeError struct {
	Code int	// 错误码
	err string  // 错误信息，把这个信息隐藏起来，所以是小写
}

// 实现error的接口
func (e *CodeError) Error() string {
	return fmt.Sprintf("%v: %s", e.Code, e.err)
}

// 直接返回错误
func wrang() error {
	return &CodeError{
		100,
		"出错了",
	}
}

func main() {
	e := wrang()
	fmt.Println(e)

	w := fmt.Errorf("新错误信息: %w", e) 
	var ce *CodeError  // 创建一个新的变量，用于接收值，现在都是零值
	if errors.As(w, &ce) {  // 把指针传给函数，函数内会对变量赋值
		fmt.Println(ce.Code)  // 获取到错误的Code属性了
	}
}